#include <iostream>
#include <vector>
using namespace std;

//vector 容器 里面的数据结构 是数组(结点(struct)与结点(struct)的关系是数组)
//采用类模板<T>实现 可以实现数据类型和数据结构的分离
//往容器里面加元素,这个元素必须是可以copy的

//数组元素的弹入(添加)弹出(删除)的函数
//push_back() pop_back() front() back()
//push_back
void test1()
{
        vector<int> v1;
        cout<<"length:"<<v1.size()<<endl;//0

        //在尾部插入元素和删除(弹出)元素
        v1.push_back(1);
        v1.push_back(2);
        v1.push_back(3);
        cout<<"length:"<<v1.size()<<endl;//3

        cout<<"头部元素: "<<v1.front()<<endl;

        //修改 头部元素
        //函数返回值当左值 应该返回一个引用
        v1.front() = 11; //front返回的是引用
        v1.back() = 55; //back返回的是引用

        while (v1.size() > 0)
        {
                cout<<"尾部元素: "<<v1.back()<< endl; //获取尾部元素
                v1.pop_back();//删除尾部元素
        }
}

//vector容器的初始化
void test2()
{
        vector<int> v1;
        v1.push_back(1);
        v1.push_back(2);
        v1.push_back(3);
        v1.push_back(4);
        v1.push_back(5);
        v1.push_back(6);
        v1.push_back(7);
        
        vector<int> v2 = v1;
        vector<int> v3(v1.begin(), v1.begin()+2);
}

void printV(vector<int> &v)
{
        for (int i = 0; i < v.size(); i++)
        {
                cout<<v[i] <<" ";
        }
        cout<<endl;
}

//vector 遍历 通过数组的方式
void test3()
{
        vector<int> v1(10); //需要提前把内存准备好
        for (int i = 0; i < 10; i++)
        {
                v1[i] = i + 1; //
        }

        // for (int i = 0; i < 10; i++)
        // {
        //         printf("%d ", v1[i]);
        // }
        // cout<<endl;

        printV(v1);
}

//vector push_back强化记忆
void test4()
{
        vector<int> v1(10); 
        v1.push_back(100); //在尾部插入会自动分配内存
        v1.push_back(200);
        cout<<"size: "<<v1.size()<<endl;
        printV(v1);
}



//1.迭代器
//  1    3    5
//🕒
//                   🕒
//当 it = v1.end() 说明这个容器已经遍历完毕了...
//v1.end()的位置  应该是5的后面

//2.迭代器种类
void test5()
{
        vector<int> v1(10);
        for (int i = 0; i < 10; i++)
        {
                v1[i] = i + 1;       
        }

        //正向遍历 正向迭代器
        for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
        {
                cout<<*it<<" ";
        }
        cout<<endl;

        //逆序遍历 逆序迭代器
        for (vector<int>::reverse_iterator rit = v1.rbegin();  rit < v1.rend(); rit++)
        {
                cout<<*rit<<" ";
        }
        cout<<endl;
}

//vector 删除
void test6()
{
        vector<int> v1(10);
        for (int i = 0; i < 10; i++)
        {
                v1[i] = i + 1;       
        }

        //区间删除
        v1.erase(v1.begin(), v1.begin()+3);
        printV(v1);

        //指定位置删除
        v1.erase(v1.begin()); //在头部删除
        printV(v1);

        //根据元素的值 删除
        v1[1] = 2;
        v1[3] = 2;
        printV(v1);
        for (vector<int>::iterator it = v1.begin(); it != v1.end(); )
        {
                if(*it == 2)
                {
                       it =  v1.erase(it); //当 删除迭代器所指向的元素的时候,erase删除函数会让it自动向下移动
                }else{
                        it++;
                }
        }
        printV(v1);

        v1.insert(v1.begin(), 100);
        v1.insert(v1.end(), 200);
        printV(v1);
}

int main(int argc, char const *argv[])
{
        //test1();
        //test2();
        //test3();
        //test4();
        //test5();
        test6();
        
        return 0;
}
